#ifndef SYMBOLE_H_
#define SYMBOLE_H_

#include <iostream>
#include <vector>
#include <string>
using namespace std;

#define FICHIER_MOTS_CLE "motsCles.txt"
/*! \file Symbole.h
    \brief La spécification de la classe Symbole
    \author Cedric Vierne et Sergio Vasquez
    \date 18.04.2011
 */

/*! \class Symbole
    \brief La classe représentant la lecture des caracteres

    Cette classe permet stocker les symbole.
 */
class Symbole {
public:
    /*! \fn categorieSymbole
        \brief Donne la categorie des symboles pouvant être stocker
    */
    enum categorieSymbole {
        MOTCLE, VARIABLE, ENTIER, INDEFINI, FINDEFICHIER, CHAINE
    };

    /*! \fn Symbole(string s = string(""))
        \brief Constructeur de la classe Symbole
       * Il construit le symbole à partir de la chaine (string) ch lue par le lecteur de symbole dans un fichier
       * \param s 
    */
    Symbole(string s = string(""));
    
    /*! \fn operator ==(string ch)
        \brief Sert à tester l'égalité entre le symbole et une chaîne
       * \param ch 
    */    
    bool operator ==(string ch); 

    
    /*! \fn bool operator !=(string ch)
        \brief Sert à tester la différence...
     *  \param string ch
     *  \return bool
    */
    inline bool operator !=(string ch) {
        return !(*this == ch);
    } 

    
    /*! \fn string getChaine()
        \brief  accesseur
     *  \return string
    */
    inline string getChaine() {
        return this->chaine;
    } 
    
    
    /*! \fn friend ostream & operator <<(ostream & cout, Symbole symb)
     *  \brief C'est une fonction amie pour pouvoir afficher un symbole sur cout
     *  \param ostream & cout, Symbole symb
    */
    friend ostream & operator <<(ostream & cout, Symbole symb);


private:

    /*! \var chaine
      *  \brief C'est une chaine du symbole
      * 
    */
    string chaine;
    
     /*! \var categorieSymbole categorie
      *  \brief C'est la categorie du symbole (voir type énuméré ci-dessus)
      * 
    */
    categorieSymbole categorie;
    
    /*! \fn static bool isMotCle(string s)
      *  \brief méthode de classe : renvoie vrai si s est un mot clé du langage
     *   \param string s
     *      \return bool
      * 
    */
    static bool isMotCle(string s);  
};

#endif /* SYMBOLE_H_ */
